package cn.kgc.factory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author Rock
 * @create 2020-08-25 23:16
 */
public class ProxyFactory {
    private Object target; //目标对象

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object createProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * 代理对象调用的所有方法都会触发该方法执行
             * @param proxy 代理对象
             * @param method 被代理的方法
             * @param args 被代理的方法传参
             * @return 被代理的方法返回值
             * @throws Throwable 异常
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if ("deleteUser".equals(method.getName())) {
                    // 增强指定方法
                    Integer id;
                    id = (Integer) args[0];
                    id++; //增强参数
                    System.out.println("增强方法体 1/2");
                    String invoke = (String) method.invoke(target, id);
                    invoke = invoke + "!!!"; //增强返回值
                    System.out.println("增强方法体 2/2");
                    return invoke;

                } else {
                    // 其它方法默认实现
                    Object invoke = method.invoke(target, args);
                    return invoke;
                }
            }
        });
    }
}
